package com.example.managesystem.service.impl;

import com.example.managesystem.chain.AbstractChainContext;
import com.example.managesystem.constant.Constant;
import com.example.managesystem.constant.MessageConstant;
import com.example.managesystem.context.BaseContext;
import com.example.managesystem.dto.ItemUserUpdateDTO;
import com.example.managesystem.dto.ResetPasswordDTO;
import com.example.managesystem.dto.UserLoginDTO;
import com.example.managesystem.entity.User;
import com.example.managesystem.exception.AccountNotFoundException;
import com.example.managesystem.exception.PasswordErrorException;
import com.example.managesystem.mapper.ItemMapper;
import com.example.managesystem.mapper.UserItemRelaMapper;
import com.example.managesystem.mapper.UserMapper;
import com.example.managesystem.service.UserService;
import com.example.managesystem.vo.ItemMaintextVO;
import com.example.managesystem.vo.ItemsMaintextVO;
import com.example.managesystem.vo.SelectUserMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Autowired
    private UserItemRelaMapper userItemRelaMapper;
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private AbstractChainContext abstractChainContext;
    /*@Autowired
    private RedissonClient redissonClient;*/

    /**
     * 账号密码登录
     * @param userLoginDTO
     * @return
     */
    @Override
    public User login(UserLoginDTO userLoginDTO) {
        System.out.println("进入登录方法 : " + userLoginDTO);
//        abstractChainContext.handler("login", userLoginDTO);
//        RLock lock = redissonClient.getLock(Constant.LOCK_USER_LOGIN + userLoginDTO.getUserid());
        String userid = userLoginDTO.getUserid();
        String password = userLoginDTO.getPassword();

        User user = userMapper.getByUserId(userid);
        System.out.println("用户信息为：" + user);
        //2、处理各种异常情况（用户名不存在、密码不对）
        if (user == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        //密码比对
        // 对前端传过来的明文密码进行md5加密，然后再进行比对
//        password = DigestUtils.md5DigestAsHex(password.getBytes());

        if (!password.equals(user.getPassword())) {
            System.out.println(password + "------" + user.getPassword());
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        //3、返回实体对象
        return user;
    }

    /**
     * 重置密码
     * @param resetPasswordDTO
     */
    @Override
    public void resetPassword(ResetPasswordDTO resetPasswordDTO) {
        String userid = resetPasswordDTO.getUserid();
        String oldPassword = resetPasswordDTO.getOldpassword();
        String newPassword = resetPasswordDTO.getNewpassword();
        User user = userMapper.getByUserId(userid);

        //2、处理各种异常情况（用户名不存在、密码不对）
        if (user == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        //密码比对
        // 对前端传过来的明文密码进行md5加密，然后再进行比对
        oldPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes());
        if (!oldPassword.equals(user.getPassword())) {
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }
        if (oldPassword.equals(newPassword)) {
            //新密码与旧密码一致
            throw new PasswordErrorException(MessageConstant.PASSWORD_NOT_CHANGE);
        }

        /*log.info("用户id为{}，旧密码为{}，新密码为{}",userid,oldPassword,newPassword);*/
        newPassword = DigestUtils.md5DigestAsHex(newPassword.getBytes());
        userMapper.updatePassword(userid,newPassword);


    }

    /**
     * 获取当前用户下的项目
     * @return
     */
    @Override
    public ItemsMaintextVO getMyItems() {
        //获取当前登录的userid(在设置拦截器时，将usrid设置到 BaseContext的ThreadLocal中)
        Long id= BaseContext.getCurrentId();
        String userid=String.valueOf(id);
        log.info("当前用户号为{}",userid);

        //根据userid 到用户项目关系表里查询出所有的item_id
        List<Integer> itemslist = userItemRelaMapper.getItemsByUserId(userid);
        log.info("根据用户号查询用户所拥有的项目，用户号为{}，项目为{}",userid,itemslist);

        //遍历每一个item_id，查询出项目对应的基本信息
        ItemsMaintextVO itemsMaintextVO=new ItemsMaintextVO();
        log.info("开始遍历每一个项目id");
        for(Integer itemId:itemslist){
            String itemStatus = itemMapper.getItemStatus(itemId);
            if(itemStatus.contains("立项")) {
                //根据当前item_id 查询出项目对应的基本信息 此时还剩余 负责人指导教师信息

                log.info("开始遍历每一个项目id{}", itemId);
                ItemMaintextVO itemMaintextVO = itemMapper.getByItemId(itemId);
                log.info("输出查询到的项目信息：{}", itemMaintextVO);

                //现在是根据itemid 去查询项目表当中对应的负责人和指导教师的userid
                String prinuserid = itemMapper.getPrinuseridByItemId(itemId);
                String conduserid = itemMapper.getConduseridByItemId(itemId);
                String prinName = userMapper.getNameByUserId(prinuserid);
                String condName = userMapper.getNameByUserId(conduserid);
                itemMaintextVO.setPrinName(prinName);
                itemMaintextVO.setCondName(condName);

                log.info("输出查询到的项目信息：{}", itemMaintextVO);
                itemsMaintextVO.add(itemMaintextVO);
            }
        };
        return itemsMaintextVO;

    }

    /**
     * 更新项目人员 重新插入项目的成员
     */
    @Override
    public void updatePeople(ItemUserUpdateDTO itemUserUpdateDTO) {
        Integer itemId = itemUserUpdateDTO.getItemId();

        // 因为项目下的负责人 成员  以及 审核老师 指导老师
        // 在进行项目详情的查询时 是按照顺序进行查询的，因此需要吧对应的负责人以及老师
        //也需要删除 用户 项目关系表当中对应的 负责人 审核老师老师 指导老师。然后再插入

        // 获取负责人 审核老师 指导老师用户号
        String prinuserid1 = userItemRelaMapper.getidByItemidWithRole(itemId, 0);
        String prinuserid2 = userItemRelaMapper.getidByItemidWithRole(itemId, 1);
        if(prinuserid1!=null){
            String prinuserid = prinuserid1;
            String work = userItemRelaMapper.getWorkByItemidWithUserid(itemId, prinuserid);
            //删除 用户项目关系表当中已有的负责人
            userItemRelaMapper.deleteUserItem(itemId,prinuserid,0);
            //插入用户项目关系表
            userItemRelaMapper.insertUserItem(prinuserid ,itemId,0,work);
        }else {
            String prinuserid = prinuserid2;
            String work = userItemRelaMapper.getWorkByItemidWithUserid(itemId, prinuserid);
            //删除 用户项目关系表当中已有的负责人
            userItemRelaMapper.deleteUserItem(itemId,prinuserid,1);
            //插入用户项目关系表
            userItemRelaMapper.insertUserItem(prinuserid ,itemId,1,work);
        }
        //插入 审核老师指导老师 到关系表当中去
        String examuserid = userItemRelaMapper.getidByItemidWithRole(itemId, 3);
        String work1=userItemRelaMapper.getWorkByItemidWithUserid(itemId, examuserid);
        String conduserid = userItemRelaMapper.getidByItemidWithRole(itemId, 4);
        String work2=userItemRelaMapper.getWorkByItemidWithUserid(itemId, conduserid);


        //删除 用户项目关系表当中已有的审核老师
        userItemRelaMapper.deleteUserItem(itemId,examuserid,3);
        //删除 用户项目关系表当中已有的指导老师
        userItemRelaMapper.deleteUserItem(itemId,conduserid,4);


        //遍历插入到用户集合
        //修改用户表 修改用户 项目关系表
        List<User> users = itemUserUpdateDTO.getUsers();
        for(int i=0;i<users.size();i++){
            User user1 = users.get(i);
            log.info("用户id为：{}",user1.getUserid());

            //更新用户表当中的信息
            userMapper.updateMessage(user1);
            //删除 用户项目关系表当中已有的成员
            userItemRelaMapper.deleteUserItem(itemId,user1.getUserid(),2);
            //更新员工 项目关系表。当中的成员
            userItemRelaMapper.insertUserItem(user1.getUserid(),itemId,2,user1.getWork());
        }
        userItemRelaMapper.insertUserItem(examuserid ,itemId,3,work1);
        userItemRelaMapper.insertUserItem(conduserid ,itemId,4,work2);

    }

    /**
     * 根据用户id查询用户信息
     * @return
     */
    @Override
    public SelectUserMessageVO selectUserMessage(String userid) {
        log.info("根据用户id查询用户信息");
        SelectUserMessageVO selectUserMessageVO = new SelectUserMessageVO();
        User user = userMapper.getByUserId(userid);
        BeanUtils.copyProperties(user,selectUserMessageVO);
        return selectUserMessageVO;
    }


}
